const db = require('../db/index.js')
// 导入bcryptjs 对密码进行加密
const bcrypt = require('bcryptjs')
// 导入 jwt 用于生成token
const jwt = require('jsonwebtoken')
// 导入配置文件 用于加密和解密
const jwtconfig = require('../jwt_config/index.js')

// 注册新用户的处理函数
exports.register = (req, res) => {
  // req是前端传过来的数据,也就是Request,res 是返回给前端的数据,也就是result
  const reginfo = req.body
  // 对数据进行合法性的判断 判断账号和密码是否为空
  if (!reginfo.account || !reginfo.password) {
    return res.send({
      status: 1,
      message: '账号或密码不能为空'
    })
  }
  // 第二步，判断前端传过来的账号信息是否在数据库中存在
  // 定义sql语句
  const sql = 'select * from users where account=?'
  db.query(sql, reginfo.account, (err, results) => {
    // 执行sql语句失败
    if (err) {
      return res.send({
        status: 1,
        message: err.message
      })
    }
    // 执行sql语句成功，但是查询到的数据条数不等于1
    if (results.length > 0) {
      return res.send({
        status: 1,
        message: '该账号已被注册'
      })
    }
    //第三步 对密码进行加密  md5加密
    // 调用 bcrypt.hashSync() 对密码进行加密
    // 第一个参数是要加密的密码，第二个参数是加密的长度
    reginfo.password = bcrypt.hashSync(reginfo.password, 10)

    // 第四步，将前端传过来的数据插入到数据库中
    // 定义sql语句
    const sqlInsert = 'insert into users set?'
    // 初始化其他数据
    const identity = '用户'
    // 创建时间
    const create_time = new Date()
    // 调用db.query()执行sql语句
    db.query(
      sqlInsert,
      {
        account: reginfo.account,
        password: reginfo.password,
        identity,
        create_time,
        // 初始未冻结状态为0
        status: 0
      },
      (err, results) => {
        // 执行sql语句失败
        if (err) {
          return res.send({
            status: 1,
            message: err.message
          })
        }
        // 执行sql语句成功，但影响行数不为1,则插入失败
        if (results.affectedRows !== 1) {
          return res.send({
            status: 1,
            message: '注册用户失败，请稍后再试!'
          })
        }
        // 注册用户成功
        res.send({
          status: 0,
          message: '注册用户成功'
        })
      }
    )
  })
}

exports.login = (req, res) => {
  const loginfo = req.body
  // 查询数据库表中是否有前端传过来的账号
  // 定义sql语句
  const sql = 'select * from users where account=?'
  db.query(sql, loginfo.account, (err, results) => {
    // 执行sql语句失败
    if (err) return res.cc({ err })

    // 执行sql语句成功，但是查询到的数据条数不等于1
    if (results.length !== 1) {
      return res.cc('账号不存在')
    }
    // 对前端传过来的密码进行解密
    // 第一个参数是要解密的密码，第二个参数是数据库中存储的密码
    const compareResult = bcrypt.compareSync(
      loginfo.password,
      results[0].password
    )
    if (!compareResult) {
      return res.cc('密码错误')
    }
    // 判断账号是否冻结
    if (results[0].status === 1) {
      return res.cc('账号被冻结')
    }
    // 生成token
    // 剔除加密后的密码,头像,创建时间,更新时间
    const user = {
      ...results[0],
      password: '',
      imageUrl: '',
      create_time: '',
      update_time: ''
    }
    // 设置token的过期时间
    // 调用jwt.sign()生成token
    const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, {
      expiresIn: '24h'
    })
    // 调用res.send()将 token 返回给前端
    res.send({
      results: results[0],
      status: 0,
      message: '登录成功',
      token: 'Bearer' + tokenStr
    })
  })
}
